package jobase

type Set[T comparable] struct {
	data map[T]EmptyStruct
}

func NewSet[T comparable]() *Set[T] {
	return &Set[T]{
		data: make(map[T]EmptyStruct),
	}
}

func (s *Set[T]) Add(v T) {
	s.data[v] = EmptyStruct{}
}

func (s *Set[T]) Remove(v T) {
	delete(s.data, v)
}

func (s *Set[T]) Size() int {
	return len(s.data)
}

func (s *Set[T]) Clear() {
	s.data = make(map[T]EmptyStruct)
}

func (s *Set[T]) Exist(v T) bool {
	_, ok := s.data[v]
	return ok
}

func (s *Set[T]) ToSlice() []T {
	var result []T

	for k := range s.data {
		result = append(result, k)
	}

	return result
}
